#该算法容易陷入局部最优解，因为每次想要收敛都依赖于新的中心点的计算，而新的中心点的计算方法会直接导致陷入局部最优解，所以可以多次运行该算法，求得最优值
import numpy
from matplotlib import pyplot
data=numpy.loadtxt('./testSet.txt')
length=len(data)
index=numpy.random.permutation(length)[0:4]#[11,18,45,51]这个初始值不行
print(index)
#随机选出4个中心点
old_centre_point=data[index]
new_centre_point=old_centre_point.copy()
first=True
print(old_centre_point)
while numpy.any(old_centre_point!=new_centre_point) or first==True:#当前后两次的中心点相同时停止循环,全为False时候才返回False
    old_centre_point = new_centre_point.copy()#记录上一次的值
    distance_class=numpy.empty((4,length))
    for j in range(4):
        for i in range(length):
            distance_class[j,i]=numpy.sqrt(numpy.sum((data[i]-old_centre_point[j])**2))
    class_index=numpy.argmin(distance_class,axis=0)
    dic_class={}
    for i in  range(4):
        dic_class[i]=data[class_index==i]
    #下面重新计算中心点
    for i in range(4):
        new_centre_point[i]=numpy.sum(dic_class[i],axis=0)/len(dic_class[i])
    #必须记录前后中心点的记录
    print(new_centre_point)
    pyplot.scatter(data[:, 0], data[:, 1], c=class_index)
    pyplot.scatter(old_centre_point[:, 0], old_centre_point[:, 1], c='red')#画出每次老的中心点
    pyplot.show()
    first=False 